//
//  LCStuatusListViewModel.swift
//  SwiftWeiBo
//
//  Created by LiCheng on 2017/2/13.
//  Copyright © 2017年 LiCheng. All rights reserved.
//

import Foundation

/// 微博数据列表视图模型

// - 负责微博的数据处理
//   - 字典转模型
//   - 下拉/上拉刷新数据


/// 上拉加载最大尝试次数
fileprivate let maxPullTryTimes = 3

class LCStatusListViewModel {

    /// 微博模型数组懒加载
    lazy var statusList = [LCStatus]()

    /// 请求失败计数
    fileprivate var pullupErrorTimes = 0

    /// 加载微博数据
    ///
    /// - Parameters:
    ///   - isPullpo:   是否是上拉加载
    ///   - completion: 回调isSuccess:是否成功
    func loadStatus(isPullpo: Bool, completion:@escaping (_ isSuccess: Bool, _ shouldRefresh: Bool) -> ()) {

        // 1. 判断是否是上拉刷新，同时判断检查刷新错误
        if isPullpo && pullupErrorTimes > maxPullTryTimes {

            completion(true, false)
            return
        }

        // 2. 请求参数
        //    - 上拉加载  取数据中的最后一条数据
        let since_id = isPullpo ? 0 : (statusList.first?.id ?? 0)
        //    - 下拉刷新  取数据中的第一条数据
        let max_id = !isPullpo ? 0 : (statusList.last?.id ?? 0)

        // 3. 请求
        LCNetworkManager.shared.loadStatusList(since_id: since_id, max_id: max_id) { (list, isSuccess) in

            // 1> 字典转模型
            guard let array = NSArray.yy_modelArray(with: LCStatus.self, json: list ?? []) as? [LCStatus] else {
                completion(isSuccess, false)
                return
            }

            // 2> 拼接数据
            if isPullpo {
                // - 上拉加载 将结果数据拼接在数组后面
                self.statusList += array

            }else {
                // - 下拉刷新 将结果数据拼接在数组前面
                self.statusList = array + self.statusList
            }

            // 3> 判断是否超过上拉次数
            if isPullpo && array.count == 0 {

                self.pullupErrorTimes += 1
                completion(isSuccess, false)
            }

            // 4> 完成回调
            completion(isSuccess, true)
        }
    }
}
